/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package repository;

import beans.Endereco;
import interacesRepository.IRepositoryFuncionario;
import beans.Funcionario;
import beans.Telefone;
import connection.ConnectionBD;
import interacesRepository.IRepositoryFuncionario;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import telas.Login;

/**
 *
 * @author dlvcpe
 */
public class RepositoryFuncionario implements IRepositoryFuncionario {

    private static RepositoryFuncionario instancia;

    private RepositoryFuncionario() {
    }

    public static RepositoryFuncionario getInstancia() {
        if (instancia == null) {
            instancia = new RepositoryFuncionario();
        }
        return instancia;
    }

    public void inserir(Funcionario funcionario) {
        try {
            Statement stmt = ConnectionBD.getInstance().createStatement();
            String linhaSQL = new String();

            String stringTelefone = new String();
            Collection<Telefone> tels = funcionario.getTelefone();

            for (Iterator it = tels.iterator(); it.hasNext();) {
                Telefone telefone = (Telefone) it.next(); // isso se você não souber que tipo de elementos tem a sua collection
                stringTelefone = stringTelefone + "telefone_tp('" + telefone.getDdd() + "', '" + telefone.getNumero() + "')";
                if (it.hasNext()) {
                    stringTelefone = stringTelefone + ",";
                }
            }

            linhaSQL = ("insert into funcionario_tb(login, nome, senha, email, sexo, dtnasc, telefone_nt, endereco_nt ) "
                    + "values ('"
                    + funcionario.getLogin() + "', '"
                    + funcionario.getNome() + "', '"
                    + funcionario.getSenha() + "', '"
                    + funcionario.getEmail() + "', '"
                    + funcionario.getSexo() + "', " +//SEXO
                    " to_date('"+funcionario.getDataNascimento() + "','DD/MM/YYYY'), " +//to_date('06/06/1986','DD/MM/YYYY')
                    "telefone_nt_tp(" + stringTelefone + "),"
                    + "endereco_nt_tp( endereco_tp('"
                    + funcionario.getEndereco().getRua() + "', '"
                    + funcionario.getEndereco().getBairro() + "', '"
                    + funcionario.getEndereco().getCidade() + "', '"
                    + funcionario.getEndereco().getEstado() + "', '"
                    + funcionario.getEndereco().getCep() + "' )) )");

            System.out.println("Linha SQL " + linhaSQL);
            stmt.execute(linhaSQL);

        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void excluir(Funcionario funcionario) {//Login PK
        try {
            Statement stmt = ConnectionBD.getInstance().createStatement();
            String linhaSQL = ("delete from funcionario_tb where login = '" + funcionario.getLogin() + "'");
//             if (Main.paramentros.getImprimirSQL() == 1){
//                System.out.println(linhaSQL);
//            } 
            ResultSet rs = stmt.executeQuery(linhaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    @Override
    public void alterar(Funcionario funcionario) {
        try {
            Statement stmt = ConnectionBD.getInstance().createStatement();
             String stringTelefone = new String();
            Collection<Telefone> tels = funcionario.getTelefone();

            for (Iterator it = tels.iterator(); it.hasNext();) {
                Telefone telefone = (Telefone) it.next(); // isso se você não souber que tipo de elementos tem a sua collection
                stringTelefone = stringTelefone + "telefone_tp('" + telefone.getDdd() + "', '" + telefone.getNumero() + "')";
                if (it.hasNext()) {
                    stringTelefone = stringTelefone + ",";
                }
            }

//            linhaSQL1 = ("UPDATE funcionario_tb nome, senha, email, sexo, dtnasc, telefone_nt, endereco_nt ) "
////                    + "values ('"
//                    +"LOGIN = " + funcionario.getLogin() + ", "
//                    + " "+funcionario.getNome() + "', '"
//                    + funcionario.getSenha() + "', '"
//                    + funcionario.getEmail() + "', '"
//                    + funcionario.getSexo() + "', " +//SEXO
//                    funcionario.getDataNascimento() + ", " +//to_date('06/06/1986','DD/MM/YYYY')
//                    "telefone_nt_tp(" + stringTelefone + "),"
//                    + "endereco_nt_tp( endereco_tp('"
//                    + funcionario.getEndereco().getRua() + "', '"
//                    + funcionario.getEndereco().getBairro() + "', '"
//                    + funcionario.getEndereco().getCidade() + "', '"
//                    + funcionario.getEndereco().getEstado() + "', '"
//                    + funcionario.getEndereco().getCep() + "' )) )");

            String linhaSQL = " update funcionario_tb set nome = '" + funcionario.getNome()
                    + "', email ='"+funcionario.getEmail()+"' , senha = '"+funcionario.getSenha()+"',  sexo = '"+ funcionario.getSexo()+ "', "
                    + "dtnasc = to_date('"+funcionario.getDataNascimento()+"','DD/MM/YYYY'), telefone_nt = telefone_nt_tp("+stringTelefone+ "), "
                    + "endereco_nt = endereco_nt_tp(endereco_tp('" + funcionario.getEndereco().getRua()
                    + "', '" + funcionario.getEndereco().getBairro() + "', '"
                    + funcionario.getEndereco().getCidade() + "', '"
                    + funcionario.getEndereco().getEstado() + "', '"
                    + funcionario.getEndereco().getCep() + "'))  where login = '" + funcionario.getLogin() + "'";

//            String linhaSQL1 = ("update funcionario_tb set nome = '" + funcionario.getNome()
//                    + "', email ='"+funcionario.getEmail()+"' , senha = '"+funcionario.getSenha()+"', "
//                    + " sexo = '"+ funcionario.getSexo()+ "', dtnasc = to_date('"+funcionario.getDataNascimento()
//                    +"','DD/MM/YYYY'), telefone_nt ="+stringTelefone+ ","
//                    +" endereco_nt = tp_endereco('" + funcionario.getEndereco().getRua()
//                    + "', '" + funcionario.getEndereco().getBairro() + "', '"
//                    + funcionario.getEndereco().getCidade() + "', '"
//                    + funcionario.getEndereco().getEstado() + "', '"
//                    + funcionario.getEndereco().getCep() + "'), "
//                    + " where login = '" + funcionario.getLogin() + "'");
//             if (Main.paramentros.getImprimirSQL() == 1){
//                System.out.println(linhaSQL);
//            }
            stmt.execute(linhaSQL);

            System.out.println("Linha Altera Funcionario =>"+ linhaSQL);
            //stmt.execute(linhaSQL);
        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//    @Override
//    public Funcionario consultarClienteLogin(String login) {
//        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
//    }
    @Override
    public Collection consultarnome(String nome) {
        List c = new ArrayList();

        try {
           // String linhaSQL = new String("select c.id, c.nome, c.endereco.rua, c.endereco.bairro, c.endereco.cidade, c.endereco.estado, c.endereco.cep, c.endereco.pontoreferencia, c.limitecredito from tb_cliente c where c.nome like '" + nome + "%'");
            //+++++++++++++++++++++++++
             String linhaSQL = new String(" SELECT  f.login, f.nome,f.senha,f.email,f.sexo,f.dtnasc,telefone.*,endereco.*"
                    + "FROM  funcionario_tb f, "
                    + "TABLE(f.telefone_nt) telefone,"
                    + "TABLE(f.endereco_nt) endereco "
                    + "WHERE   f.nome = '" + nome + "'");
            //+++++++++++++++++++
            
            Statement stmt = ConnectionBD.getInstance().createStatement();

//            if (Main.paramentros.getImprimirSQL() == 1){
//                System.out.println(linhaSQL);
//            }

            ResultSet rs = stmt.executeQuery(linhaSQL);


            while (rs.next()) {
                Funcionario z = new Funcionario();
//              z.setId( (Integer.parseInt(rs.getObject(1).toString())));

//      login VARCHAR2(10),
//  	nome VARCHAR2(30),
//  	senha VARCHAR2(10),
//  	email VARCHAR2(40),
//  	sexo CHAR(1),
//  	dtnasc DATE,
//  	telefone_nt telefone_nt_tp,
//   	endereco_nt endereco_nt_tp
                z.setLogin(rs.getObject(1).toString());
                z.setNome(rs.getObject(2).toString());
                z.setSenha(rs.getObject(3).toString());
                z.setEmail(rs.getObject(4).toString());
                z.setSexo(rs.getObject(5).toString());
                z.setDataNascimento(rs.getObject(6).toString());
//              Telefone tel = new Telefone();
//              tel = rs.getObject(7);;
                z.setTelefone(c);
                Endereco e = new Endereco();
                e.setRua(rs.getObject(3).toString());
                e.setBairro(rs.getObject(4).toString());
                e.setCidade(rs.getObject(5).toString());
                e.setEstado(rs.getObject(6).toString());
                e.setCep(rs.getObject(7).toString());

                z.setEndereco(e);

                c.add(z);
            }

        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return c;
    }

    @Override
    public Collection consultartodos() {

        List c = new ArrayList();

        try {
//            login VARCHAR2(10),
//  	nome VARCHAR2(30),
//  	senha VARCHAR2(10),
//  	email VARCHAR2(40),
//  	sexo CHAR(1),
//  	dtnasc DATE,
//  	telefone_nt telefone_nt_tp,
//   	endereco_nt endereco_nt_tp
            String linhaSQL = new String("select c.login, c.nome, c.senha, "
                    + "c.email, c.sexo, c.dtnasc,"
                    + "c.telefone "
                    + "c.endereco.bairro, c.endereco.cidade, c.endereco.estado, "
                    + "c.endereco.cep, c.endereco.pontoreferencia, c.limitecredito from tb_cliente c");
            Statement stmt = ConnectionBD.getInstance().createStatement();

//            if (Main.paramentros.getImprimirSQL() == 1){
//                System.out.println(linhaSQL);
//            };
            ResultSet rs = stmt.executeQuery(linhaSQL);

            while (rs.next()) {
                Funcionario z = new Funcionario();
                z.setLogin(rs.getObject(1).toString());//(Integer.parseInt(rs.getObject(1).toString())));
                z.setNome(rs.getObject(2).toString());

                Endereco e = new Endereco();
                e.setRua(rs.getObject(3).toString());
                e.setBairro(rs.getObject(4).toString());
                e.setCidade(rs.getObject(5).toString());
                e.setEstado(rs.getObject(6).toString());
                e.setCep(rs.getObject(7).toString());

                z.setEndereco(e);

                c.add(z);
            }

        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return c;
    }

    @Override
    public int totalCadastrados() {
        Integer resultado = 0;
        try {
            String linhaSQL = new String("SELECT COUNT(*) FROM funcionario_tb");
            Statement stmt = ConnectionBD.getInstance().createStatement();
            ResultSet rs = stmt.executeQuery(linhaSQL);
            while (rs.next()) {
                resultado = Integer.parseInt(rs.getString(1).toString());
            }
            return resultado;
        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultado;

    }

    @Override
    public Funcionario consultarFuncionarioLogin(String login) {
        Funcionario z = new Funcionario();
            ArrayList telefone = new ArrayList();

        try {
            String linhaSQL = new String(" SELECT  f.login, f.nome,f.senha,f.email,f.sexo,f.dtnasc, "
                    + " endereco.*"
                    + "FROM  funcionario_tb f, "
                    + "TABLE(f.telefone_nt) telefone,"
                    + "TABLE(f.endereco_nt) endereco "
                    + "WHERE   f.login = '" + login + "'");

            Statement stmt = ConnectionBD.getInstance().createStatement();
//            if (Main.paramentros.getImprimirSQL() == 1){
//                System.out.println(linhaSQL);
//            };
            ResultSet rs = stmt.executeQuery(linhaSQL);
            int cont = 1;
            while (rs.next()) {
                System.out.println("Contador "+ cont);
                z.setLogin(rs.getObject(1).toString());//(Integer.parseInt(rs.getObject(1).toString())));
                System.out.println("Login >= "+ z.getLogin());
                z.setNome(rs.getObject(2).toString());
                System.out.println("Nome >= "+z.getNome());
                z.setSenha(rs.getObject(3).toString());
                z.setEmail(rs.getObject(4).toString());
                z.setSexo(rs.getObject(5).toString());
                z.setDataNascimento(rs.getObject(6).toString());
               // z.setEndereco((Endereco) rs.getObject(7));
                Endereco e = new Endereco();
                e.setRua(rs.getObject(7).toString());;
                e.setBairro(rs.getObject(8).toString());
                e.setCidade(rs.getObject(9).toString());
                e.setEstado(rs.getObject(10).toString());
                e.setCep(rs.getObject(11).toString());
                z.setEndereco(e);
            }Statement stmt2 = ConnectionBD.getInstance().createStatement();
            ResultSet rs2 = stmt2.executeQuery("select tel.* from funcionario_tb c, table(c.telefone_nt) tel where c.login = '" + login + "'");
            Telefone tel;
            while (rs2.next()) {
                tel = new Telefone();
                tel.setDdd(rs2.getObject(1).toString());
                tel.setNumero(rs2.getObject(2).toString());
                telefone.add(tel);
                
            }
            z.setTelefone(telefone);
                System.out.println("Tamanho dos tels=>>  "+telefone.size());
                for (int i = 1; i < telefone.size(); i++) {
//                    System.out.println("Tel "+ i+ " = "+ t);
                    tel = (Telefone) telefone.get(i);
                    System.out.println("Tel DDD "+ tel.getDdd());
                    System.out.println("Tel Num "+ tel.getNumero());

                }
                
//            }

//            Statement stmt2 = ConnectionBD.getInstance().createStatement();
//            ResultSet rs2 = stmt2.executeQuery("select tel.* from funcionario_tb c, table(c.telefone_nt) tel where c.login = '" + login + "'");
//
//            while (rs2.next()) {
//                    telefone.add(rs2.getObject(1).toString());
//            }
            System.out.println("++++++++++ FIM DO REPOSITORY");
        
        } catch (SQLException ex) {
            Logger.getLogger(RepositoryFuncionario.class.getName()).log(Level.SEVERE, null, ex);
        }
        return z;

    }
}
